single: Chebyshev series single: fitting, using Chebyshev polynomials single: interpolation, using Chebyshev polynomials
Note
번역중
This chapter describes routines for computing Chebyshev approximations to univariate functions. A Chebyshev approximation is a truncation of the series f(x) = ∑cnTn(x), where the Chebyshev polynomials Tn(x) = cos (narccos x) provide an orthogonal basis of polynomials on the interval [ − 1, 1] with the weight function
The functions described in this chapter are declared in the header file gsl_chebyshev.h
.
gsl_cheb_series
A Chebyshev series is stored using the following structure:
typedef struct
{
double * c; /* coefficients c[0] .. c[order] */
int order; /* order of expansion */
double a; /* lower interval point */
double b; /* upper interval point */
...
} gsl_cheb_series
The approximation is made over the range [a, b] using order
+ 1 terms, including the coefficient c[0]. The series is computed using the following convention,
not texinfo
texinfo
f(x) = (c_0 / 2) + \sum_{n=1} c_n T_n(x)
which is needed when accessing the coefficients directly.
gsl_cheb_series * gsl_cheb_alloc (const size_t n)
This function allocates space for a Chebyshev series of order n
and returns a pointer to a new gsl_cheb_series
struct.
void gsl_cheb_free (gsl_cheb_series * cs)
This function frees a previously allocated Chebyshev series cs
.
int gsl_cheb_init (gsl_cheb_series * cs, const gsl_function * f, const double a, const double b)
This function computes the Chebyshev approximation cs
for the function f
over the range (a, b) to the previously specified order. The computation of the Chebyshev approximation is an O(n2) process, and requires n function evaluations.
The following functions provide information about an existing Chebyshev series.
size_t gsl_cheb_order (const gsl_cheb_series * cs)
This function returns the order of Chebyshev series cs
.
size_t gsl_cheb_size (const gsl_cheb_series * cs) double * gsl_cheb_coeffs (const gsl_cheb_series * cs)
These functions return the size of the Chebyshev coefficient array c[]
and a pointer to its location in memory for the Chebyshev series cs
.
double gsl_cheb_eval (const gsl_cheb_series * cs, double x)
This function evaluates the Chebyshev series cs
at a given point x
.
int gsl_cheb_eval_err (const gsl_cheb_series * cs, const double x, double * result, double * abserr)
This function computes the Chebyshev series cs
at a given point x
, estimating both the series result
and its absolute error abserr
. The error estimate is made from the first neglected term in the series.
double gsl_cheb_eval_n (const gsl_cheb_series * cs, size_t order, double x)
This function evaluates the Chebyshev series cs
at a given point x
, to (at most) the given order order
.
int gsl_cheb_eval_n_err (const gsl_cheb_series * cs, const size_t order, const double x, double * result, double * abserr)
This function evaluates a Chebyshev series cs
at a given point x
, estimating both the series result
and its absolute error abserr
, to (at most) the given order order
. The error estimate is made from the first neglected term in the series.
The following functions allow a Chebyshev series to be differentiated or integrated, producing a new Chebyshev series. Note that the error estimate produced by evaluating the derivative series will be underestimated due to the contribution of higher order terms being neglected.
int gsl_cheb_calc_deriv (gsl_cheb_series * deriv, const gsl_cheb_series * cs)
This function computes the derivative of the series cs
, storing the derivative coefficients in the previously allocated deriv
. The two series cs
and deriv
must have been allocated with the same order.
int gsl_cheb_calc_integ (gsl_cheb_series * integ, const gsl_cheb_series * cs)
This function computes the integral of the series cs
, storing the integral coefficients in the previously allocated integ
. The two series cs
and integ
must have been allocated with the same order. The lower limit of the integration is taken to be the left hand end of the range a
.
The following example program computes Chebyshev approximations to a step function. This is an extremely difficult approximation to make, due to the discontinuity, and was chosen as an example where approximation error is visible. For smooth functions the Chebyshev approximation converges extremely rapidly and errors would not be visible.
fig_cheb
shows output from the program with the original function, 10-th order approximation and 40-th order approximation, all sampled at intervals of 0.001 in x.
The following paper describes the use of Chebyshev series,
- R. Broucke, "Ten Subroutines for the Manipulation of Chebyshev Series [C1] (Algorithm 446)". Communications of the ACM 16(4), 254--256 (1973)